5.2 匹配的重复次数

上节学习的 +*? 解决了许多问题,但有些问题光靠它们还不够。请思考以下问题:

  • +* 匹配的字符个数没有上限。我们无法为它们将匹配的字符个数设定一个最大值。
  • +*? 至少匹配零个或一个字符。我们无法为它们将匹配的字符个数另行设定一个最小值。
  • ❑ 如果只使用 +* ,我们无法把它们将匹配的字符个数设定为一个精确的数字。

为了解决这些问题并让程序员对重复性匹配有更多的控制,正则表达式语言提供了一个用来设定重复次数(interval)的语法。重复次数要用 {} 字符来给出——把数值写在它们之间。

注意

{} 是元字符。如果需要匹配“{”和“}”本身,就应该用 \ 对它们进行转义。不过,即使你没有对 {} 进行转义,大部分正则表达式实现也能正确地处理它们(根据具体情况把它们解释为普通字符或元字符)。话虽如此,为了避免不必要的麻烦,你最好不要依赖这种行为;在需要把 {} 当做普通字符来匹配的场合,还是使用它们的转义序列 \{\} 比较稳妥。

5.2.1 为匹配次数设置一个精确值

如果你想为重复匹配次数设定一个精确的值,把那个数字写在 {} 之间即可。比如说, {3} 意味着模式里的前一个字符(或字符集合)必须在原始文本里连续重复出现 3 次才算是一个匹配;如果只重复了两次,则不算是一个匹配。

还记得我们之前多次使用过的匹配 16 进制颜色值的例子吗?

使用精确值后模式是不是精简了非常多。

5.2.2 为重复匹配次数设定一个区间

{} 语法还可以用来为重复匹配次数设定一个区间——也就是为重复次数设定一个最多值或(和)一个最小值。这种区间以 {最小值,最大值} 这样的形式给出。 {2,4} 的含义是最少重复 2 次,最多重复 4 次。看下面这个匹配 IPV4 地址的例子:

IPV4 由 4 组数字组成,每组数字可能有 1 到 3 位数字。 \d 可以匹配出数字, {1,3} 匹配 1 到 3 位数字,再加上 \. 就可以匹配出 IPV4 地址了。

思考

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 可以匹配出 IPV4,但如果待匹配文本里面有“999.999.999.999”也会被匹配出来。显然“999.999.999.999”并不是有效的 IPV4 地址,你知道怎么做才能只匹配有效的 IPV4 吗?我们将在第七章学习到

5.2.3 匹配至少重复多少次

{} 语法的最后一种用法是给出一个最小重复次数,但不用给出最大。比如 {3,} 表示最少重复 3 次,但不限制最多重复的次数。看下面匹配 URL 地址的例子:

注意

https?://[\w.]{3,} 来匹配 URL 并不严谨,请谨慎直接用于生产环境。

发表评论